/**
 * @file ExperiMsgProtocol.h
 * @author w
 * @brief 试验命令协议编解码
 * @version 0.1
 * @date 2024-04-25
 *
 * @copyright Copyright (c) 2024 xxxx公司
 *
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2024-04-25 <td>v1.0     <td>chen     <td>内容
 * </table>
 */
#pragma once
#include <string>
#include <vector>
#include "ExperiDefs.h"
#include "JsonCppHandler.h"

/**
 * @brief 试验消息编解码
 *
 * @details
 */
class CExperiMsgProtocol {
public:
	/**
	 * @brief 设置协议版本号
	 * @param [in] version 版本号
	 *
	 * @details
	 */
	void setHeaderVersion(std::string version);
	/**
	 * @brief 设置 试验id
	 * @param [in] experID  试验id
	 *
	 * @details
	 */
	void setHeaderExperID(std::string experID);
	/**
	 * @brief 设置试验应用名称
	 * @param [in] appCode 试验应用名称
	 *
	 * @details
	 */
	void setHeaderAppCode(std::string appCode);
	/**
	 * @brief 设置时间戳
	 * @param [in] timestamp 时间戳
	 *
	 * @details
	 */
	void setHeaderTimestamp(unsigned long long timestamp);
	/**
	 * @brief 设置试验指令
	 * @param [in] cmd 试验指令
	 *
	 * @details
	 */
	void setBodyCmd(int cmd);
	/**
	 * @brief 设置试验指令执行状态成功或失败
	 * @param [in] state 试验指令执行状态成功或失败
	 *
	 * @details
	 */
	void setBodyState(int state);
	/**
	 * @brief 设置试验指令执行状态成功或失败的信息描述
	 * @param [in] message 试验指令执行状态成功或失败的信息描述
	 *
	 * @details
	 */
	void setBodyMessage(std::string message);
	/**
	 * @brief 设置试验消息追踪id
	 * @param [in] traceId 试验消息追踪id
	 *
	 * @details
	 */
	void setBodyTraceId(std::string traceId);
	/**
	 * @brief 获取协议版本号
	 * @return std::string 协议版本号
	 *
	 * @details
	 */
	std::string getHeaderVersion() const;
	/**
	 * @brief  获取试验id
	 * @return std::string  试验id
	 *
	 * @details
	 */
	std::string getHeaderExperID() const;
	/**
	 * @brief 获取试验应用名称
	 * @return std::string 试验应用名称
	 *
	 * @details
	 */
	std::string getHeaderAppCode() const;
	/**
	 * @brief 获取时间戳
	 * @return unsigned long long 时间戳
	 *
	 * @details
	 */
	unsigned long long getHeaderTimestamp() const;
	/**
	 * @brief 获取试验指令
	 * @return int 试验指令
	 *
	 * @details
	 */
	int getBodyCmd() const;
	/**
	 * @brief 获取 试验指令执行状态成功或失败
	 * @param [in] state 试验指令执行状态成功或失败
	 * @return int 0成功, 1失败
	 *
	 * @details
	 */
	int getBodyState(int state) const;
	/**
	 * @brief 获取试验指令执行状态成功或失败的信息描述
	 * @return std::string 试验指令执行状态成功或失败的信息描述
	 *
	 * @details
	 */
	std::string getBodyMessage() const;
	/**
	 * @brief 获取试验消息追踪id
	 * @return std::string 试验消息追踪id
	 *
	 * @details
	 */
	std::string getBodyTraceId() const;
	/**
	 * @brief 获取样本文件服务地址
	 * @return std::string 样本文件服务地址
	 *
	 * @details
	 */
	std::string getBodyUrl() const;
	/**
	 * @brief 获取消息体中的多个试验域信息
	 * @return std::vector<std::string>
	 *
	 * @details
	 */
	std::vector<std::string> getBodyDomains() const;
	/**
	 * @brief 获取消息体中的单个试验域信息
	 * @return std::string
	 *
	 * @details
	 */
	std::string getBodyDomain() const;
	/**
	 * @brief 获取样本文件信息
	 * @return std::string 样本文件信息
	 *
	 * @details
	 */
	std::string getBodySample() const;
	/**
	 * @brief 获取消息体中的试验应用信息
	 * @return std::vector<std::string> 获取消息体中的试验应用信息
	 *
	 * @details
	 */
	std::vector<std::string> getBodyApps() const;
	/**
	 * @brief 拼接试验指令消息
	 * @return Json::Value  试验指令消息对象json格式
	 *
	 * @details
	 */
	Json::Value packMsg() const;
	/**
	 * @brief 解析试验指令消息
	 * @param [in] experiCmdMessage 试验指令消息
	 * @return int 0成功,-1 失败
	 *
	 * @details
	 */
	virtual int unpackMsg(const std::string& experiCmdMessage) = 0;

private:
private:
	Json::Value m_jsonObj; ///< 试验消息json对象
	Json::Value m_jsonDataObj; ///< 试验消息 data字段 json对象
	std::string m_version; ///< 协议版本
	std::string m_experID; ///< 试验id
	std::string m_appCode; ///< 试验应用名称
	unsigned long long m_timestamp{0}; ///< 拼接消息的时间戳
	int m_cmd; ///< 试验指令
	int m_state{0}; ///< 0 成功 1 失败

	std::string m_message; ///< 成功或失败的状态描述
	std::string m_traceId; ///< 试验消息唯一id,用于追踪

	std::string m_url; ///< 试验任务文件访问资源地址
	std::vector<std::string> m_domains; ///< 试验域
	std::string m_dataDomain; ///< 消息体中的试验域信息
	std::string m_sample; ///< 任务样本文件
	std::vector<std::string> m_apps; ///< 消息体中的试验应用信息
};